import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../common/api/index.dart';
import '../../../../common/models/index.dart';
import '../../../../common/services/user_service.dart';

/// 举报信息页面控制器
class ReportController extends GetxController {
  
  // 举报信息列表
  final RxList<ReportItem> reportList = <ReportItem>[].obs;
  
  // 分页信息
  final RxInt currentPage = 1.obs;
  final RxInt totalPages = 0.obs;
  final RxInt totalCount = 0.obs;
  
  // 加载状态
  final RxBool isLoading = false.obs;
  final RxBool isLoadingMore = false.obs;
  final RxBool hasMoreData = true.obs;
  
  // 错误状态
  final RxString errorMessage = ''.obs;
  final RxBool hasError = false.obs;

  @override
  void onInit() {
    super.onInit();
    debugPrint('🔧 ReportController - onInit() 控制器初始化');
    
    // 初始化加载数据
    loadReportInfo(isRefresh: true);
  }

  /// 加载举报信息
  /// [isRefresh] 是否为刷新（重置页码）
  Future<void> loadReportInfo({bool isRefresh = false}) async {
    try {
      debugPrint('🔄 =============== 开始加载举报信息 ===============');
      
      // 检查用户登录状态
      final userService = UserService.to;
      if (!userService.isLoggedIn) {
        debugPrint('❌ 用户未登录');
        _showError('用户未登录');
        return;
      }

      // 设置加载状态
      if (isRefresh) {
        isLoading.value = true;
        hasError.value = false;
        errorMessage.value = '';
        currentPage.value = 1;
        hasMoreData.value = true;
        debugPrint('🔄 刷新模式：重置页码为1');
      } else {
        // 检查是否还有更多数据
        if (!hasMoreData.value) {
          debugPrint('📭 没有更多数据，停止加载');
          return;
        }
        
        isLoadingMore.value = true;
        currentPage.value += 1;
        debugPrint('📄 加载更多：当前页码为${currentPage.value}');
      }

      final userId = userService.currentUserProfile?.userid;
      if (userId == null) {
        debugPrint('❌ 无法获取用户ID');
        _showError('无法获取用户ID');
        return;
      }
      debugPrint('👤 当前用户ID: $userId');

      // 🔥 调用API获取举报信息（与微信小程序保持一致）
      final response = await ReportApi.getReportInfo(
        reporterId: userId.toString(),
        page: currentPage.value,
        // ⚠️ 不传pageSize参数（后端自动使用默认值20）
      );

      if (response['status'] == 'success') {
        // 更新数据
        final List<dynamic> reportsData = response['reports'] ?? [];
        final newReports = reportsData
            .map((item) => ReportItem.fromJson(item as Map<String, dynamic>))
            .toList();
        
        debugPrint('📊 获取到${newReports.length}条举报信息');

        if (isRefresh) {
          // 刷新模式：替换所有数据
          reportList.clear();
          reportList.addAll(newReports);
          debugPrint('🔄 刷新完成：列表包含${reportList.length}条记录');
        } else {
          // 加载更多模式：追加数据
          reportList.addAll(newReports);
          debugPrint('📈 加载更多完成：列表总计${reportList.length}条记录');
        }

        // 更新分页信息
        if (response['pagination'] != null) {
          final paginationData = response['pagination'] as Map<String, dynamic>;
          final pagination = ReportPagination.fromJson(paginationData);
          
          totalPages.value = pagination.totalPages ?? 0;
          totalCount.value = pagination.total ?? 0;
          hasMoreData.value = pagination.hasNextPage;
          
          debugPrint('📄 分页信息更新：第${currentPage.value}页，共${totalPages.value}页，总计${totalCount.value}条');
          debugPrint('📄 是否还有更多数据: ${hasMoreData.value}');
        } else {
          // 如果没有分页信息，且当前获取的数据少于预期，认为没有更多数据
          hasMoreData.value = newReports.length >= 20; // 假设每页20条
          debugPrint('📄 无分页信息：根据数据量判断是否有更多数据 - ${hasMoreData.value}');
        }

        // 清除错误状态
        hasError.value = false;
        errorMessage.value = '';

      } else {
        // 处理失败情况
        final error = response['message'] ?? '获取举报信息失败';
        debugPrint('❌ 获取举报信息失败: $error');
        
        if (isRefresh) {
          _showError(error);
        } else {
          // 加载更多失败时，恢复页码
          currentPage.value -= 1;
          _showToast(error);
        }
      }

    } catch (e) {
      debugPrint('💥 加载举报信息异常: $e');
      
      if (isRefresh) {
        _showError('加载失败: ${e.toString()}');
      } else {
        // 加载更多失败时，恢复页码
        currentPage.value -= 1;
        _showToast('加载失败');
      }
      
    } finally {
      // 重置加载状态
      isLoading.value = false;
      isLoadingMore.value = false;
      debugPrint('🏁 =============== 举报信息加载结束 ===============');
    }
  }

  /// 刷新数据
  Future<void> refreshData() async {
    debugPrint('🔄 手动刷新举报信息');
    await loadReportInfo(isRefresh: true);
  }

  /// 加载更多数据
  Future<void> loadMoreData() async {
    debugPrint('📄 加载更多举报信息');
    await loadReportInfo(isRefresh: false);
  }

  /// 获取举报状态显示文本和颜色
  Map<String, dynamic> getReportStatusDisplay(ReportItem report) {
    String statusText = '未知状态';
    String statusColor = 'grey';

    switch (report.processStatus) {
      case 0:
        statusText = '待处理';
        statusColor = 'orange';
        break;
      case 1:
        statusText = '处理中';
        statusColor = 'blue';
        break;
      case 2:
        statusText = '已处理';
        statusColor = 'green';
        break;
      case 3:
        statusText = '已驳回';
        statusColor = 'red';
        break;
      default:
        statusText = '未知状态';
        statusColor = 'grey';
        break;
    }

    return {
      'text': statusText,
      'color': statusColor,
    };
  }

  /// 格式化举报时间
  String formatReportTime(String? timeStr) {
    if (timeStr == null || timeStr.isEmpty) {
      return '未知时间';
    }

    try {
      final DateTime reportTime = DateTime.parse(timeStr);
      final DateTime now = DateTime.now();
      final Duration difference = now.difference(reportTime);

      if (difference.inDays > 0) {
        return '${difference.inDays}天前';
      } else if (difference.inHours > 0) {
        return '${difference.inHours}小时前';
      } else if (difference.inMinutes > 0) {
        return '${difference.inMinutes}分钟前';
      } else {
        return '刚刚';
      }
    } catch (e) {
      debugPrint('⚠️ 时间格式化异常: $e');
      return timeStr;
    }
  }

  /// 获取举报类型显示文本
  String getReportTypeDisplay(String? reportType) {
    switch (reportType) {
      case 'user':
      case '用户':
        return '举报用户';
      case 'activity':
      case '活动':
        return '举报活动';
      case 'comment':
      case '评论':
        return '举报评论';
      case 'content':
      case '内容':
        return '举报内容';
      default:
        return reportType ?? '未知类型';
    }
  }

  /// 显示错误信息
  void _showError(String message) {
    hasError.value = true;
    errorMessage.value = message;
    _showToast(message);
    debugPrint('❌ 显示错误: $message');
  }

  /// 显示Toast消息
  void _showToast(String message) {
    Get.snackbar(
      '提示',
      message,
      snackPosition: SnackPosition.TOP,
      backgroundColor: Colors.black54,
      colorText: Colors.white,
      duration: const Duration(seconds: 2),
    );
  }

  /// 重试加载
  void retryLoad() {
    debugPrint('🔄 重试加载举报信息');
    loadReportInfo(isRefresh: true);
  }

  /// 获取空状态显示文本
  String get emptyStateText {
    if (hasError.value) {
      return errorMessage.value;
    } else if (reportList.isEmpty && !isLoading.value) {
      return '暂无举报信息';
    } else {
      return '';
    }
  }

  /// 是否显示空状态
  bool get shouldShowEmptyState {
    return !isLoading.value && reportList.isEmpty;
  }

  /// 是否显示列表
  bool get shouldShowList {
    return !shouldShowEmptyState;
  }

  @override
  void onClose() {
    debugPrint('💾 ReportController - onClose() 控制器关闭');
    super.onClose();
  }
}

